The aim of analyzing the provided crime and temperature data is to gain insights into the relationship between various factors such as weather conditions and crime incidents.Explore patterns and trends in crime incidents.This will help identify areas with higher crime rates and understand the nature of incidents that occur.Provide recommendations for crime prevention: Based on our analysis, we aim to identify potential strategies or interventions that can help mitigate the impact of weather-related factors on crime.

library(dplyr)
library(tidyr)
library(stringr)
library(tidytext)
library(e1071)
library(mlbench)
library(ggplot2)
library(gridExtra)

We have loaded the data of the temperature in which all the date , temperature , wind and its speed , pressure at sea level in hectopascals (hPa) , total cloud cover in octas , low cloud cover in octas , sunshine during in hour of that day , Visibility in kilometers, Snow depth in centimeters these are few column

df<- read.csv("temp2023.csv")
head(df)
df$Date <- as.Date(df$Date, format="%m/%d/%Y")
df
df_avg <- df %>%
  group_by(month = format(Date, "%m"), year = format(Date, "%Y")) %>%
  summarise(
    across(
      where(is.numeric),
      mean,
      na.rm = TRUE
    ),
    .groups = 'drop'
  ) %>%
  mutate(date_formatted = paste(year, month, sep="-"))
Warning: There was 1 warning in `summarise()`.
ℹ In argument: `across(where(is.numeric), mean, na.rm = TRUE)`.
ℹ In group 1: `month = NA`, `year = NA`.
Caused by warning:
! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
Supply arguments directly to `.fns` through an anonymous function instead.

  # Previously
  across(a:b, mean, na.rm = TRUE)

  # Now
  across(a:b, \(x) mean(x, na.rm = TRUE))
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
df_avg$date_formatted
[1] "NA-NA"
df_avg%>%head(10)
NA
df1<- read.csv("crime23.csv")

df1%>%head(10)
NA
merged_data <- merge(df_avg, df1, by.x="date_formatted", by.y="date", all=TRUE)
merged_data%>%head(10)
names(merged_data)
 [1] "date_formatted"   "month"            "year"             "station_ID"       "TemperatureCAvg"  "TemperatureCMax" 
 [7] "TemperatureCMin"  "TdAvgC"           "HrAvg"            "WindkmhInt"       "WindkmhGust"      "PresslevHp"      
[13] "Precmm"           "TotClOct"         "lowClOct"         "SunD1h"           "VisKm"            "SnowDepcm"       
[19] "category"         "persistent_id"    "lat"              "long"             "street_id"        "street_name"     
[25] "context"          "id"               "location_type"    "location_subtype" "outcome_status"  
merged_data %>%
select(date_formatted) %>%
count(date_formatted, sort = TRUE, name = "Count")%>%
ggplot(aes(factor(date_formatted), Count, group = 1)) +     
geom_bar(stat = "identity", fill = "red", color = "black") +
geom_line(color = "black") +
geom_smooth() +
geom_point(color = "green") +
geom_text(aes(label = Count, vjust = -0.3), color = "black") +
scale_x_discrete(guide = guide_axis(angle = 90)) +
labs(x = "Month", y = "count of  Incident categeory") +
theme_minimal()

summary(merged_data)
 date_formatted        month               year             station_ID   TemperatureCAvg TemperatureCMax TemperatureCMin
 Length:6879        Length:6879        Length:6879        Min.   :3590   Min.   :10.92   Min.   :15.13   Min.   :6.365  
 Class :character   Class :character   Class :character   1st Qu.:3590   1st Qu.:10.92   1st Qu.:15.13   1st Qu.:6.365  
 Mode  :character   Mode  :character   Mode  :character   Median :3590   Median :10.92   Median :15.13   Median :6.365  
                                                          Mean   :3590   Mean   :10.92   Mean   :15.13   Mean   :6.365  
                                                          3rd Qu.:3590   3rd Qu.:10.92   3rd Qu.:15.13   3rd Qu.:6.365  
                                                          Max.   :3590   Max.   :10.92   Max.   :15.13   Max.   :6.365  
                                                          NA's   :6878   NA's   :6878    NA's   :6878    NA's   :6878   
     TdAvgC          HrAvg         WindkmhInt     WindkmhGust      PresslevHp       Precmm         TotClOct        lowClOct    
 Min.   :7.578   Min.   :81.25   Min.   :16.81   Min.   :40.87   Min.   :1014   Min.   :1.866   Min.   :4.988   Min.   :6.443  
 1st Qu.:7.578   1st Qu.:81.25   1st Qu.:16.81   1st Qu.:40.87   1st Qu.:1014   1st Qu.:1.866   1st Qu.:4.988   1st Qu.:6.443  
 Median :7.578   Median :81.25   Median :16.81   Median :40.87   Median :1014   Median :1.866   Median :4.988   Median :6.443  
 Mean   :7.578   Mean   :81.25   Mean   :16.81   Mean   :40.87   Mean   :1014   Mean   :1.866   Mean   :4.988   Mean   :6.443  
 3rd Qu.:7.578   3rd Qu.:81.25   3rd Qu.:16.81   3rd Qu.:40.87   3rd Qu.:1014   3rd Qu.:1.866   3rd Qu.:4.988   3rd Qu.:6.443  
 Max.   :7.578   Max.   :81.25   Max.   :16.81   Max.   :40.87   Max.   :1014   Max.   :1.866   Max.   :4.988   Max.   :6.443  
 NA's   :6878    NA's   :6878    NA's   :6878    NA's   :6878    NA's   :6878   NA's   :6878    NA's   :6878    NA's   :6878   
     SunD1h          VisKm         SnowDepcm      category         persistent_id           lat             long       
 Min.   :5.127   Min.   :32.11   Min.   :1      Length:6879        Length:6879        Min.   :51.88   Min.   :0.8793  
 1st Qu.:5.127   1st Qu.:32.11   1st Qu.:1      Class :character   Class :character   1st Qu.:51.89   1st Qu.:0.8964  
 Median :5.127   Median :32.11   Median :1      Mode  :character   Mode  :character   Median :51.89   Median :0.9014  
 Mean   :5.127   Mean   :32.11   Mean   :1                                            Mean   :51.89   Mean   :0.9030  
 3rd Qu.:5.127   3rd Qu.:32.11   3rd Qu.:1                                            3rd Qu.:51.89   3rd Qu.:0.9088  
 Max.   :5.127   Max.   :32.11   Max.   :1                                            Max.   :51.90   Max.   :0.9246  
 NA's   :6878    NA's   :6878    NA's   :6878                                         NA's   :1       NA's   :1       
   street_id       street_name        context              id            location_type      location_subtype   outcome_status    
 Min.   :2152702   Length:6879        Mode:logical   Min.   :107582824   Length:6879        Length:6879        Length:6879       
 1st Qu.:2153025   Class :character   NA's:6879      1st Qu.:109309182   Class :character   Class :character   Class :character  
 Median :2153158   Mode  :character                  Median :111497486   Mode  :character   Mode  :character   Mode  :character  
 Mean   :2153877                                     Mean   :111301793                                                           
 3rd Qu.:2153365                                     3rd Qu.:113746477                                                           
 Max.   :2343256                                     Max.   :115699577                                                           
 NA's   :1                                           NA's   :1                                                                   
merged_data %>%
  select(category) %>%
  count(category, sort = TRUE, name = "Count")
# Create a subset of merged_data containing only "street_name" and "category" columns
subset_data <- merged_data[, c("date_formatted", "category")]

# Remove rows with missing values
subset_data <- na.omit(subset_data)

# Plot a bar graph
barplot(table(subset_data$date_formatted, subset_data$category), 
        main = "Category Distribution by date_formatted",
        xlab = "category",
        ylab = "Count",
        las = 2, # Rotate x-axis labels vertically
        col = rainbow(length(unique(subset_data$category))),  # Assign different colors to each category
        legend = TRUE)  # Show legend

NA
NA
# Calculate the count and percentage for each category
d <- merged_data %>%
  count(category) %>%
  mutate(perc = round(100 * n / sum(n)))

# Plot the pie chart
ggplot(data = d, aes(x = "", y = n, fill = category)) + 
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(perc, "%")), position = position_stack(vjust = 0.5)) +
  labs(fill = 'Category', x = NULL, y = NULL, title = 'Incidents by Category', subtitle = 'Percentage of Total') +
  coord_polar(theta = "y") +
  theme_minimal()

# Remove rows with NA values
cleaned_data <- na.omit(merged_data[, c("TemperatureCAvg", "TemperatureCMin", "TemperatureCMax", "SnowDepcm")])

# Dot plot with custom color palette and summary statistics
p <- ggplot(cleaned_data, aes(x = SnowDepcm, color = "TemperatureCAvg")) +
  geom_point(aes(y = TemperatureCAvg), size = 3) +
  geom_point(aes(y = TemperatureCMin, color = "TemperatureCMin"), size = 3) +
  geom_point(aes(y = TemperatureCMax, color = "TemperatureCMax"), size = 3) +
  scale_color_manual(values = c("TemperatureCAvg" = "#999999", "TemperatureCMin" = "#E69F00", "TemperatureCMax" = "#56B4E9")) +
  labs(x = "Snow Depth (cm)", y = "Temperature (°C)", color = "Variables") +
  theme_minimal() +
  stat_summary(aes(y = TemperatureCAvg), fun = mean, geom = "point", shape = 18, size = 3, color = "red") +  # Add mean points
  stat_summary(aes(y = TemperatureCAvg), fun = median, geom = "point", shape = 18, size = 3, color = "blue")  # Add median points

# Preview the plot with custom color palette and summary statistics
p

print(colnames(merged_data))
 [1] "date_formatted"   "month"            "year"             "station_ID"       "TemperatureCAvg"  "TemperatureCMax" 
 [7] "TemperatureCMin"  "TdAvgC"           "HrAvg"            "WindkmhInt"       "WindkmhGust"      "PresslevHp"      
[13] "Precmm"           "TotClOct"         "lowClOct"         "SunD1h"           "VisKm"            "SnowDepcm"       
[19] "category"         "persistent_id"    "lat"              "long"             "street_id"        "street_name"     
[25] "context"          "id"               "location_type"    "location_subtype" "outcome_status"  
library(patchwork)

# Histogram for WindkmhInt
hist_windkmhInt <- ggplot(merged_data, aes(x = WindkmhInt)) +
  geom_histogram(binwidth = 1, fill = "skyblue", color = "black", alpha = 0.6) +
  labs(title = "WindSpeed(km/h)-Int", x = "Wind Speed (km/h)", y = "Frequency")

# Histogram for WindkmhGust
hist_windkmhGust <- ggplot(merged_data, aes(x = WindkmhGust)) +
  geom_histogram(binwidth = 1, fill = "lightgreen", color = "black", alpha = 0.6) +
  labs(title = "Wind Speed(km/h)-Gust", x = "Wind Speed (km/h)", y = "Frequency")

# Histogram for VisKm
hist_VisKm <- ggplot(merged_data, aes(x = VisKm)) +
  geom_histogram(binwidth = 1, fill = "salmon", color = "black", alpha = 0.6) +
  labs(title = "Visibility(km)", x = "Visibility (km)", y = "Frequency")

# Arrange histograms together
hist_windkmhInt + hist_windkmhGust + hist_VisKm + plot_layout(ncol = 3)

merged_data <- merged_data[!is.na(merged_data$outcome_status), ]
summary(merged_data$outcome_status)
   Length     Class      Mode 
     6201 character character 
# Load the ggplot2 package
library(ggplot2)

# Create a scatter plot with jittered points
sinaplot <- ggplot(merged_data, aes(x = street_id, y = category)) +
  geom_jitter(width = 0.3, height = 0.3) +  # Jitter the points to avoid overlap
  labs(x = "street_id", y = "Category", title = "Sinaplot of Outcome Status and Category")

# Print the sinaplot
print(sinaplot)

library(ggplot2)

# Create a jitter plot
ggplot(merged_data, aes(x = date_formatted, y = category)) +
  geom_jitter(alpha = 0.5) +
  labs(x = "Date Formatted", y = "category", title = "Relation between Date Formatted and Street Name") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) # Rotate x-axis labels

# Calculate the correlation matrix
correlation_matrix <- cor(merged_data[, c("TemperatureCAvg", "TemperatureCMax", "TemperatureCMin", "SnowDepcm")])

# Visualize the correlation matrix using a heatmap
library(ggplot2)

# Convert the correlation matrix to a data frame
correlation_df <- as.data.frame(as.table(correlation_matrix))

# Plot the heatmap
ggplot(correlation_df, aes(Var1, Var2, fill = Freq)) +
  geom_tile(color = "white") +
  scale_fill_gradient2(low = "blue", mid = "white", high = "red", 
                       midpoint = 0, limit = c(-1,1), space = "Lab",
                       name="Correlation") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + 
  coord_fixed()

NA
NA
print(colnames(merged_data))
 [1] "date_formatted"   "month"            "year"             "station_ID"       "TemperatureCAvg"  "TemperatureCMax" 
 [7] "TemperatureCMin"  "TdAvgC"           "HrAvg"            "WindkmhInt"       "WindkmhGust"      "PresslevHp"      
[13] "Precmm"           "TotClOct"         "lowClOct"         "SunD1h"           "VisKm"            "SnowDepcm"       
[19] "category"         "persistent_id"    "lat"              "long"             "street_id"        "street_name"     
[25] "context"          "id"               "location_type"    "location_subtype" "outcome_status"  
# Load necessary libraries
library(plotly)
library(dplyr)

# Filter out rows with missing street names or categories
filtered_data <- merged_data %>%
  filter(!is.na(street_name) & !is.na(category))

# Create scatter plot
scatter_plot <- plot_ly(filtered_data, x = ~street_name, y = ~category, type = 'scatter', mode = 'markers') %>%
  layout(title = 'Scatter Plot of Categories by Street Names',
         xaxis = list(title = 'Street Name'),
         yaxis = list(title = 'Category'),
         hovermode = 'closest')

# Print the scatter plot
scatter_plot
# Load necessary libraries
library(plotly)
library(dplyr)

# Filter out rows with missing street names or categories
filtered_data <- merged_data %>%
  filter(!is.na(street_name) & !is.na(category))

# Aggregate data to count occurrences of each category by street name
count_data <- filtered_data %>%
  group_by(street_name, category) %>%
  summarise(count = n()) %>%
  ungroup()
`summarise()` has grouped output by 'street_name'. You can override using the `.groups` argument.
# Create scatter plot
scatter_plot <- plot_ly(count_data, x = ~street_name, y = ~category, z = ~count,
                        type = 'scatter3d', mode = 'markers', text = ~paste("Count: ", count)) %>%
  layout(title = 'Scatter Plot of Categories by Street Names',
         scene = list(xaxis = list(title = 'Street Name'),
                      yaxis = list(title = 'Category'),
                      zaxis = list(title = 'Count')),
         hovermode = 'closest')

# Print the scatter plot
scatter_plot
NA
# Time series plot
ggplot(category_counts, aes(x = date_formatted, y = count, color = category, group = category)) +
  geom_line() +
  labs(title = "Crime Trends in Colchester (2023)",
       x = "Date",
       y = "Number of Crimes",
       color = "Category") +
  theme_minimal()

# Time series plot with smoothing
ggplot(category_counts, aes(x = date_formatted, y = count, color = category, group = category)) +
  geom_line() +
  geom_smooth(method = "auto", se = FALSE) +  # Add smoothing line
  labs(title = "Crime Trends in Colchester (2023)",
       x = "Date",
       y = "Number of Crimes",
       color = "Category") +
  theme_minimal()

colnames(merged_data) <- paste0("col", 1:5) 
rownames(merged_data) <- paste0("row", 1:5) 
Error in `.rowNamesDF<-`(x, value = value) : invalid 'row.names' length
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhlIGFpbSBvZiBhbmFseXppbmcgdGhlIHByb3ZpZGVkIGNyaW1lIGFuZCB0ZW1wZXJhdHVyZSBkYXRhIGlzIHRvIGdhaW4gaW5zaWdodHMgaW50byB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdmFyaW91cyBmYWN0b3JzIHN1Y2ggYXMgd2VhdGhlciBjb25kaXRpb25zIGFuZCBjcmltZSBpbmNpZGVudHMuRXhwbG9yZSBwYXR0ZXJucyBhbmQgdHJlbmRzIGluIGNyaW1lIGluY2lkZW50cy5UaGlzIHdpbGwgaGVscCBpZGVudGlmeSBhcmVhcyB3aXRoIGhpZ2hlciBjcmltZSByYXRlcyBhbmQgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIGluY2lkZW50cyB0aGF0IG9jY3VyLlByb3ZpZGUgcmVjb21tZW5kYXRpb25zIGZvciBjcmltZSBwcmV2ZW50aW9uOiBCYXNlZCBvbiBvdXIgYW5hbHlzaXMsIHdlIGFpbSB0byBpZGVudGlmeSBwb3RlbnRpYWwgc3RyYXRlZ2llcyBvciBpbnRlcnZlbnRpb25zIHRoYXQgY2FuIGhlbHAgbWl0aWdhdGUgdGhlIGltcGFjdCBvZiB3ZWF0aGVyLXJlbGF0ZWQgZmFjdG9ycyBvbiBjcmltZS4KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGlkeXRleHQpCmxpYnJhcnkoZTEwNzEpCmxpYnJhcnkobWxiZW5jaCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdyaWRFeHRyYSkKCmBgYAoKV2UgaGF2ZSBsb2FkZWQgdGhlIGRhdGEgb2YgdGhlIHRlbXBlcmF0dXJlIGluIHdoaWNoIGFsbCB0aGUgZGF0ZSAsIHRlbXBlcmF0dXJlICwgd2luZCBhbmQgaXRzIHNwZWVkICwgcHJlc3N1cmUgYXQgc2VhIGxldmVsIGluIGhlY3RvcGFzY2FscyAoaFBhKSAsIHRvdGFsIGNsb3VkIGNvdmVyIGluIG9jdGFzICwgbG93IGNsb3VkIGNvdmVyIGluIG9jdGFzICwgc3Vuc2hpbmUgZHVyaW5nIGluIGhvdXIgb2YgdGhhdCBkYXkgLCBWaXNpYmlsaXR5IGluIGtpbG9tZXRlcnMsIFNub3cgZGVwdGggaW4gY2VudGltZXRlcnMgdGhlc2UgYXJlIGZldyBjb2x1bW4KCgoKYGBge3J9CmRmPC0gcmVhZC5jc3YoInRlbXAyMDIzLmNzdiIpCmhlYWQoZGYpCmBgYAoKCgoKYGBge3J9CmRmJERhdGUgPC0gYXMuRGF0ZShkZiREYXRlLCBmb3JtYXQ9IiVtLyVkLyVZIikKZGYKZGZfYXZnIDwtIGRmICU+JQogIGdyb3VwX2J5KG1vbnRoID0gZm9ybWF0KERhdGUsICIlbSIpLCB5ZWFyID0gZm9ybWF0KERhdGUsICIlWSIpKSAlPiUKICBzdW1tYXJpc2UoCiAgICBhY3Jvc3MoCiAgICAgIHdoZXJlKGlzLm51bWVyaWMpLAogICAgICBtZWFuLAogICAgICBuYS5ybSA9IFRSVUUKICAgICksCiAgICAuZ3JvdXBzID0gJ2Ryb3AnCiAgKSAlPiUKICBtdXRhdGUoZGF0ZV9mb3JtYXR0ZWQgPSBwYXN0ZSh5ZWFyLCBtb250aCwgc2VwPSItIikpCgpkZl9hdmckZGF0ZV9mb3JtYXR0ZWQKCgpkZl9hdmclPiVoZWFkKDEwKQoKYGBgCmBgYHtyfQpkZjE8LSByZWFkLmNzdigiY3JpbWUyMy5jc3YiKQoKZGYxJT4laGVhZCgxMCkKCmBgYAoKCgpgYGB7cn0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2UoZGZfYXZnLCBkZjEsIGJ5Lng9ImRhdGVfZm9ybWF0dGVkIiwgYnkueT0iZGF0ZSIsIGFsbD1UUlVFKQptZXJnZWRfZGF0YSU+JWhlYWQoMTApCmBgYAoKCmBgYHtyfQpuYW1lcyhtZXJnZWRfZGF0YSkKYGBgCgoKCmBgYHtyfQptZXJnZWRfZGF0YSAlPiUKc2VsZWN0KGRhdGVfZm9ybWF0dGVkKSAlPiUKY291bnQoZGF0ZV9mb3JtYXR0ZWQsIHNvcnQgPSBUUlVFLCBuYW1lID0gIkNvdW50IiklPiUKZ2dwbG90KGFlcyhmYWN0b3IoZGF0ZV9mb3JtYXR0ZWQpLCBDb3VudCwgZ3JvdXAgPSAxKSkgKyAgICAgCmdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKwpnZW9tX2xpbmUoY29sb3IgPSAiYmxhY2siKSArCmdlb21fc21vb3RoKCkgKwpnZW9tX3BvaW50KGNvbG9yID0gImdyZWVuIikgKwpnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQsIHZqdXN0ID0gLTAuMyksIGNvbG9yID0gImJsYWNrIikgKwpzY2FsZV94X2Rpc2NyZXRlKGd1aWRlID0gZ3VpZGVfYXhpcyhhbmdsZSA9IDkwKSkgKwpsYWJzKHggPSAiTW9udGgiLCB5ID0gImNvdW50IG9mICBJbmNpZGVudCBjYXRlZ2VvcnkiKSArCnRoZW1lX21pbmltYWwoKQpgYGAKCgoKCmBgYHtyfQpzdW1tYXJ5KG1lcmdlZF9kYXRhKQpgYGAKCgoKCmBgYHtyfQptZXJnZWRfZGF0YSAlPiUKICBzZWxlY3QoY2F0ZWdvcnkpICU+JQogIGNvdW50KGNhdGVnb3J5LCBzb3J0ID0gVFJVRSwgbmFtZSA9ICJDb3VudCIpCmBgYAoKYGBge3J9CiMgQ3JlYXRlIGEgc3Vic2V0IG9mIG1lcmdlZF9kYXRhIGNvbnRhaW5pbmcgb25seSAic3RyZWV0X25hbWUiIGFuZCAiY2F0ZWdvcnkiIGNvbHVtbnMKc3Vic2V0X2RhdGEgPC0gbWVyZ2VkX2RhdGFbLCBjKCJkYXRlX2Zvcm1hdHRlZCIsICJjYXRlZ29yeSIpXQoKIyBSZW1vdmUgcm93cyB3aXRoIG1pc3NpbmcgdmFsdWVzCnN1YnNldF9kYXRhIDwtIG5hLm9taXQoc3Vic2V0X2RhdGEpCgojIFBsb3QgYSBiYXIgZ3JhcGgKYmFycGxvdCh0YWJsZShzdWJzZXRfZGF0YSRkYXRlX2Zvcm1hdHRlZCwgc3Vic2V0X2RhdGEkY2F0ZWdvcnkpLCAKICAgICAgICBtYWluID0gIkNhdGVnb3J5IERpc3RyaWJ1dGlvbiBieSBkYXRlX2Zvcm1hdHRlZCIsCiAgICAgICAgeGxhYiA9ICJjYXRlZ29yeSIsCiAgICAgICAgeWxhYiA9ICJDb3VudCIsCiAgICAgICAgbGFzID0gMiwgIyBSb3RhdGUgeC1heGlzIGxhYmVscyB2ZXJ0aWNhbGx5CiAgICAgICAgY29sID0gcmFpbmJvdyhsZW5ndGgodW5pcXVlKHN1YnNldF9kYXRhJGNhdGVnb3J5KSkpLCAgIyBBc3NpZ24gZGlmZmVyZW50IGNvbG9ycyB0byBlYWNoIGNhdGVnb3J5CiAgICAgICAgbGVnZW5kID0gVFJVRSkgICMgU2hvdyBsZWdlbmQKCgpgYGAKCmBgYHtyfQojIENhbGN1bGF0ZSB0aGUgY291bnQgYW5kIHBlcmNlbnRhZ2UgZm9yIGVhY2ggY2F0ZWdvcnkKZCA8LSBtZXJnZWRfZGF0YSAlPiUKICBjb3VudChjYXRlZ29yeSkgJT4lCiAgbXV0YXRlKHBlcmMgPSByb3VuZCgxMDAgKiBuIC8gc3VtKG4pKSkKCiMgUGxvdCB0aGUgcGllIGNoYXJ0CmdncGxvdChkYXRhID0gZCwgYWVzKHggPSAiIiwgeSA9IG4sIGZpbGwgPSBjYXRlZ29yeSkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHBlcmMsICIlIikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkgKwogIGxhYnMoZmlsbCA9ICdDYXRlZ29yeScsIHggPSBOVUxMLCB5ID0gTlVMTCwgdGl0bGUgPSAnSW5jaWRlbnRzIGJ5IENhdGVnb3J5Jywgc3VidGl0bGUgPSAnUGVyY2VudGFnZSBvZiBUb3RhbCcpICsKICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoKYGBge3J9CiMgUmVtb3ZlIHJvd3Mgd2l0aCBOQSB2YWx1ZXMKY2xlYW5lZF9kYXRhIDwtIG5hLm9taXQobWVyZ2VkX2RhdGFbLCBjKCJUZW1wZXJhdHVyZUNBdmciLCAiVGVtcGVyYXR1cmVDTWluIiwgIlRlbXBlcmF0dXJlQ01heCIsICJTbm93RGVwY20iKV0pCgojIERvdCBwbG90IHdpdGggY3VzdG9tIGNvbG9yIHBhbGV0dGUgYW5kIHN1bW1hcnkgc3RhdGlzdGljcwpwIDwtIGdncGxvdChjbGVhbmVkX2RhdGEsIGFlcyh4ID0gU25vd0RlcGNtLCBjb2xvciA9ICJUZW1wZXJhdHVyZUNBdmciKSkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBUZW1wZXJhdHVyZUNBdmcpLCBzaXplID0gMykgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBUZW1wZXJhdHVyZUNNaW4sIGNvbG9yID0gIlRlbXBlcmF0dXJlQ01pbiIpLCBzaXplID0gMykgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBUZW1wZXJhdHVyZUNNYXgsIGNvbG9yID0gIlRlbXBlcmF0dXJlQ01heCIpLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJUZW1wZXJhdHVyZUNBdmciID0gIiM5OTk5OTkiLCAiVGVtcGVyYXR1cmVDTWluIiA9ICIjRTY5RjAwIiwgIlRlbXBlcmF0dXJlQ01heCIgPSAiIzU2QjRFOSIpKSArCiAgbGFicyh4ID0gIlNub3cgRGVwdGggKGNtKSIsIHkgPSAiVGVtcGVyYXR1cmUgKMKwQykiLCBjb2xvciA9ICJWYXJpYWJsZXMiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBzdGF0X3N1bW1hcnkoYWVzKHkgPSBUZW1wZXJhdHVyZUNBdmcpLCBmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAxOCwgc2l6ZSA9IDMsIGNvbG9yID0gInJlZCIpICsgICMgQWRkIG1lYW4gcG9pbnRzCiAgc3RhdF9zdW1tYXJ5KGFlcyh5ID0gVGVtcGVyYXR1cmVDQXZnKSwgZnVuID0gbWVkaWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAxOCwgc2l6ZSA9IDMsIGNvbG9yID0gImJsdWUiKSAgIyBBZGQgbWVkaWFuIHBvaW50cwoKIyBQcmV2aWV3IHRoZSBwbG90IHdpdGggY3VzdG9tIGNvbG9yIHBhbGV0dGUgYW5kIHN1bW1hcnkgc3RhdGlzdGljcwpwCgpgYGAKCmBgYHtyfQpwcmludChjb2xuYW1lcyhtZXJnZWRfZGF0YSkpCmBgYAoKYGBge3J9CmxpYnJhcnkocGF0Y2h3b3JrKQoKIyBIaXN0b2dyYW0gZm9yIFdpbmRrbWhJbnQKaGlzdF93aW5ka21oSW50IDwtIGdncGxvdChtZXJnZWRfZGF0YSwgYWVzKHggPSBXaW5ka21oSW50KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgZmlsbCA9ICJza3libHVlIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNikgKwogIGxhYnModGl0bGUgPSAiV2luZFNwZWVkKGttL2gpLUludCIsIHggPSAiV2luZCBTcGVlZCAoa20vaCkiLCB5ID0gIkZyZXF1ZW5jeSIpCgojIEhpc3RvZ3JhbSBmb3IgV2luZGttaEd1c3QKaGlzdF93aW5ka21oR3VzdCA8LSBnZ3Bsb3QobWVyZ2VkX2RhdGEsIGFlcyh4ID0gV2luZGttaEd1c3QpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42KSArCiAgbGFicyh0aXRsZSA9ICJXaW5kIFNwZWVkKGttL2gpLUd1c3QiLCB4ID0gIldpbmQgU3BlZWQgKGttL2gpIiwgeSA9ICJGcmVxdWVuY3kiKQoKIyBIaXN0b2dyYW0gZm9yIFZpc0ttCmhpc3RfVmlzS20gPC0gZ2dwbG90KG1lcmdlZF9kYXRhLCBhZXMoeCA9IFZpc0ttKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgZmlsbCA9ICJzYWxtb24iLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC42KSArCiAgbGFicyh0aXRsZSA9ICJWaXNpYmlsaXR5KGttKSIsIHggPSAiVmlzaWJpbGl0eSAoa20pIiwgeSA9ICJGcmVxdWVuY3kiKQoKIyBBcnJhbmdlIGhpc3RvZ3JhbXMgdG9nZXRoZXIKaGlzdF93aW5ka21oSW50ICsgaGlzdF93aW5ka21oR3VzdCArIGhpc3RfVmlzS20gKyBwbG90X2xheW91dChuY29sID0gMykKCmBgYAoKCgpgYGB7cn0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2VkX2RhdGFbIWlzLm5hKG1lcmdlZF9kYXRhJG91dGNvbWVfc3RhdHVzKSwgXQpzdW1tYXJ5KG1lcmdlZF9kYXRhJG91dGNvbWVfc3RhdHVzKQpgYGAKCmBgYHtyfQoKCmBgYAoKCmBgYHtyfQojIExvYWQgdGhlIGdncGxvdDIgcGFja2FnZQpsaWJyYXJ5KGdncGxvdDIpCgojIENyZWF0ZSBhIHNjYXR0ZXIgcGxvdCB3aXRoIGppdHRlcmVkIHBvaW50cwpzaW5hcGxvdCA8LSBnZ3Bsb3QobWVyZ2VkX2RhdGEsIGFlcyh4ID0gc3RyZWV0X2lkLCB5ID0gY2F0ZWdvcnkpKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjMsIGhlaWdodCA9IDAuMykgKyAgIyBKaXR0ZXIgdGhlIHBvaW50cyB0byBhdm9pZCBvdmVybGFwCiAgbGFicyh4ID0gInN0cmVldF9pZCIsIHkgPSAiQ2F0ZWdvcnkiLCB0aXRsZSA9ICJTaW5hcGxvdCBvZiBPdXRjb21lIFN0YXR1cyBhbmQgQ2F0ZWdvcnkiKQoKIyBQcmludCB0aGUgc2luYXBsb3QKcHJpbnQoc2luYXBsb3QpCgpgYGAKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKCiMgQ3JlYXRlIGEgaml0dGVyIHBsb3QKZ2dwbG90KG1lcmdlZF9kYXRhLCBhZXMoeCA9IGRhdGVfZm9ybWF0dGVkLCB5ID0gY2F0ZWdvcnkpKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjUpICsKICBsYWJzKHggPSAiRGF0ZSBGb3JtYXR0ZWQiLCB5ID0gImNhdGVnb3J5IiwgdGl0bGUgPSAiUmVsYXRpb24gYmV0d2VlbiBEYXRlIEZvcm1hdHRlZCBhbmQgU3RyZWV0IE5hbWUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzCgpgYGAKCmBgYHtyfQojIENhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gbWF0cml4CmNvcnJlbGF0aW9uX21hdHJpeCA8LSBjb3IobWVyZ2VkX2RhdGFbLCBjKCJUZW1wZXJhdHVyZUNBdmciLCAiVGVtcGVyYXR1cmVDTWF4IiwgIlRlbXBlcmF0dXJlQ01pbiIsICJTbm93RGVwY20iKV0pCgojIFZpc3VhbGl6ZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IHVzaW5nIGEgaGVhdG1hcApsaWJyYXJ5KGdncGxvdDIpCgojIENvbnZlcnQgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCB0byBhIGRhdGEgZnJhbWUKY29ycmVsYXRpb25fZGYgPC0gYXMuZGF0YS5mcmFtZShhcy50YWJsZShjb3JyZWxhdGlvbl9tYXRyaXgpKQoKIyBQbG90IHRoZSBoZWF0bWFwCmdncGxvdChjb3JyZWxhdGlvbl9kZiwgYWVzKFZhcjEsIFZhcjIsIGZpbGwgPSBGcmVxKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3cgPSAiYmx1ZSIsIG1pZCA9ICJ3aGl0ZSIsIGhpZ2ggPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgbWlkcG9pbnQgPSAwLCBsaW1pdCA9IGMoLTEsMSksIHNwYWNlID0gIkxhYiIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iQ29ycmVsYXRpb24iKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpICsgCiAgY29vcmRfZml4ZWQoKQoKCmBgYAoKCgpgYGB7cn0KcHJpbnQoY29sbmFtZXMobWVyZ2VkX2RhdGEpKQpgYGAKCgogIApgYGB7cn0KCmBgYAoKCmBgYHtyfQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcwpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShkcGx5cikKCiMgRmlsdGVyIG91dCByb3dzIHdpdGggbWlzc2luZyBzdHJlZXQgbmFtZXMgb3IgY2F0ZWdvcmllcwpmaWx0ZXJlZF9kYXRhIDwtIG1lcmdlZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEoc3RyZWV0X25hbWUpICYgIWlzLm5hKGNhdGVnb3J5KSkKCiMgQ3JlYXRlIHNjYXR0ZXIgcGxvdApzY2F0dGVyX3Bsb3QgPC0gcGxvdF9seShmaWx0ZXJlZF9kYXRhLCB4ID0gfnN0cmVldF9uYW1lLCB5ID0gfmNhdGVnb3J5LCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnKSAlPiUKICBsYXlvdXQodGl0bGUgPSAnU2NhdHRlciBQbG90IG9mIENhdGVnb3JpZXMgYnkgU3RyZWV0IE5hbWVzJywKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gJ1N0cmVldCBOYW1lJyksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdDYXRlZ29yeScpLAogICAgICAgICBob3Zlcm1vZGUgPSAnY2xvc2VzdCcpCgojIFByaW50IHRoZSBzY2F0dGVyIHBsb3QKc2NhdHRlcl9wbG90CmBgYAoKCmBgYHtyfQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcwpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShkcGx5cikKCiMgRmlsdGVyIG91dCByb3dzIHdpdGggbWlzc2luZyBzdHJlZXQgbmFtZXMgb3IgY2F0ZWdvcmllcwpmaWx0ZXJlZF9kYXRhIDwtIG1lcmdlZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEoc3RyZWV0X25hbWUpICYgIWlzLm5hKGNhdGVnb3J5KSkKCiMgQWdncmVnYXRlIGRhdGEgdG8gY291bnQgb2NjdXJyZW5jZXMgb2YgZWFjaCBjYXRlZ29yeSBieSBzdHJlZXQgbmFtZQpjb3VudF9kYXRhIDwtIGZpbHRlcmVkX2RhdGEgJT4lCiAgZ3JvdXBfYnkoc3RyZWV0X25hbWUsIGNhdGVnb3J5KSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JQogIHVuZ3JvdXAoKQoKIyBDcmVhdGUgc2NhdHRlciBwbG90CnNjYXR0ZXJfcGxvdCA8LSBwbG90X2x5KGNvdW50X2RhdGEsIHggPSB+c3RyZWV0X25hbWUsIHkgPSB+Y2F0ZWdvcnksIHogPSB+Y291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnc2NhdHRlcjNkJywgbW9kZSA9ICdtYXJrZXJzJywgdGV4dCA9IH5wYXN0ZSgiQ291bnQ6ICIsIGNvdW50KSkgJT4lCiAgbGF5b3V0KHRpdGxlID0gJ1NjYXR0ZXIgUGxvdCBvZiBDYXRlZ29yaWVzIGJ5IFN0cmVldCBOYW1lcycsCiAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnU3RyZWV0IE5hbWUnKSwKICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdDYXRlZ29yeScpLAogICAgICAgICAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gJ0NvdW50JykpLAogICAgICAgICBob3Zlcm1vZGUgPSAnY2xvc2VzdCcpCgojIFByaW50IHRoZSBzY2F0dGVyIHBsb3QKc2NhdHRlcl9wbG90CgpgYGAKCgoKYGBge3J9CiMgVGltZSBzZXJpZXMgcGxvdApnZ3Bsb3QoY2F0ZWdvcnlfY291bnRzLCBhZXMoeCA9IGRhdGVfZm9ybWF0dGVkLCB5ID0gY291bnQsIGNvbG9yID0gY2F0ZWdvcnksIGdyb3VwID0gY2F0ZWdvcnkpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiQ3JpbWUgVHJlbmRzIGluIENvbGNoZXN0ZXIgKDIwMjMpIiwKICAgICAgIHggPSAiRGF0ZSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBDcmltZXMiLAogICAgICAgY29sb3IgPSAiQ2F0ZWdvcnkiKSArCiAgdGhlbWVfbWluaW1hbCgpCgpgYGAKYGBge3J9CiMgVGltZSBzZXJpZXMgcGxvdCB3aXRoIHNtb290aGluZwpnZ3Bsb3QoY2F0ZWdvcnlfY291bnRzLCBhZXMoeCA9IGRhdGVfZm9ybWF0dGVkLCB5ID0gY291bnQsIGNvbG9yID0gY2F0ZWdvcnksIGdyb3VwID0gY2F0ZWdvcnkpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJhdXRvIiwgc2UgPSBGQUxTRSkgKyAgIyBBZGQgc21vb3RoaW5nIGxpbmUKICBsYWJzKHRpdGxlID0gIkNyaW1lIFRyZW5kcyBpbiBDb2xjaGVzdGVyICgyMDIzKSIsCiAgICAgICB4ID0gIkRhdGUiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgQ3JpbWVzIiwKICAgICAgIGNvbG9yID0gIkNhdGVnb3J5IikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgpgYGB7cn0KY29sbmFtZXMobWVyZ2VkX2RhdGEpIDwtIHBhc3RlMCgiY29sIiwgMTo1KSAKcm93bmFtZXMobWVyZ2VkX2RhdGEpIDwtIHBhc3RlMCgicm93IiwgMTo1KSAKICAKIyBEcmF3IGEgaGVhdG1hcCAKaGVhdG1hcChtZXJnZWRfZGF0YSkgICAgICAgICAKYGBgCgo=